package com.datastructure.huffmantree;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class HuffmanTree {

    public static void main(String[] args) {
        int arr[] = {13, 7, 8, 3, 29, 6, 1 };
        preOrder(createHuffmanTree(arr));
    }

    // 编写一个前序遍历的方法
    public static void preOrder(Node root){
        if(root != null){
           root.preOrder();
        } else {
            System.out.println("是空树，不能遍历～～");
        }
    }

    // 创建赫夫曼树的方法
    public static Node createHuffmanTree(int[] arr){
        List<Node> nodes = new ArrayList<>();
        for(int value : arr){
            nodes.add(new Node(value));
        }

        // 排序 从小到大
        Collections.sort(nodes);

        System.out.println("nodes =" + nodes);
        // 我们处理的过程是一个循环的过程
        while(nodes.size() > 1){
            // 排序 从小到大
            Collections.sort(nodes);
            System.out.println("nodes =" + nodes);
            Node leftNode = nodes.get(0);
            Node rightNode = nodes.get(1);
            Node parent = new Node(leftNode.value+rightNode.value);
            parent.left = leftNode;
            parent.right = rightNode;
            nodes.remove(leftNode);
            nodes.remove(rightNode);
            nodes.add(parent);
        }
        // 返回哈弗曼树的root结点
        return nodes.get(0);
    }
}

class Node implements Comparable<Node> {
    int value; //结点权值
    Node left; // 指向左子结点
    Node right; //指向右子结点

    // 写一个前序遍历
    public void preOrder(){
        System.out.println(this);
        if(this.left != null){
            this.left.preOrder();
        }
        if(this.right != null){
           this.right.preOrder();
        }
    }
    public Node(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }

    @Override
    public int compareTo(Node o) {
        // 表示从小到大排序
        return this.value - o.value;
    }
}
